/***************************************************************************
 *   Copyright (C) 2007 by Andreas Theofilu                                *
 *   andreas@TheoSys.at                                                    *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation version 3 of the License.                *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

#include <kmessagebox.h>
#include <klistview.h>
#include <klocale.h>
#include <qdir.h>
#include <qfile.h>
#include <qclipboard.h>
#include <qapplication.h>
#include <qlabel.h>

#include <sys/stat.h>

#include "ratenplanwidget.h"
#include "helper.h"
#include "tilgplan.h"

ratenplanWidget::ratenplanWidget ( QWidget* parent, const char* name, bool modal, WFlags fl )
		: ratenplanWidgetBase ( parent,name, modal,fl )
{
	// Spaltenbreiten und Alignment setzen
	kListView_Plan->setColumnWidth(0, 50);		// Datum
	kListView_Plan->setColumnWidth(1, 80);		// Datum
	kListView_Plan->setColumnWidth(2, 110);		// Text
	kListView_Plan->setColumnWidth(3, 100);		// Kapital
	kListView_Plan->setColumnAlignment(3, Qt::AlignRight);
	kListView_Plan->setColumnWidth(4, 100);		// Tilgung
	kListView_Plan->setColumnAlignment(4, Qt::AlignRight);
	kListView_Plan->setColumnWidth(5, 100);		// Annuität
	kListView_Plan->setColumnAlignment(5, Qt::AlignRight);
	kListView_Plan->setColumnWidth(6, 100);		// Zinsen
	kListView_Plan->setColumnAlignment(6, Qt::AlignRight);
	kListView_Plan->setColumnWidth(7, 100);		// Restkapital
	kListView_Plan->setColumnAlignment(7, Qt::AlignRight);
	kListView_Plan->setSortColumn(0);
	readDTable();
}

ratenplanWidget::~ratenplanWidget()
{}

void ratenplanWidget::readDTable()
{
QString hdir = QDir::homeDirPath ();
QString zeile, datum, text, kapital, tilg, rate, zinsen, rkapi;
QFile tmpFile;
TPPARS TpPars;
DTABLE dTable;
int day, mon, year, line;
char hv0[32];
struct stat sbuf;

	hdir.append("/.date_tbl.dat");
	tmpFile.setName(hdir);

	if (tmpFile.open(IO_ReadOnly) == FALSE)
	{
	   KMessageBox::error(0, QString("Could not open file for reading: %1").arg(tmpFile.errorString()));
	   return;
	}
	
	fstat (tmpFile.handle(), &sbuf);

	if (sbuf.st_size <= (long)sizeof(TPPARS))
	{
	   tmpFile.close ();
	   KMessageBox::information(this, i18n("Bitte berechnen sie zuerst einen Tilgungsplan!"));
	   return;
	}

	// Als erstes befindet sich die Struktur mit den Parametern und
	// Summenergebnissen in der Datei.
	read(tmpFile.handle(), &TpPars, sizeof(TPPARS));

	// Nun lesen wir den Ratenplan aus und schreiben das Ergebnis in die
	// Tabelle der Dialogbox.
	line = 1;

	while (read (tmpFile.handle(), &dTable, sizeof(DTABLE)) >= (int)sizeof(DTABLE))
	{
	      zeile.sprintf("%04d", line);
	      date_int(&day, &mon, &year, dTable.datum);
	      datum.sprintf("%02d.%02d.%d", day, mon, year);

	      switch (dTable.kz)
	      {
		 case 'U': text = QString("Auszahlung"); break;
		 case 'A': text = QString("Abschluss"); break;
		 case 'R': text = QString("Rate"); break;
		 case 'Z': text = QString::fromUtf8("Zinssatzänderung auf %1").arg(dTable.rate, 0, 'f', 3); break;
		 case 'E':
		    text = QString("Ergebnis");
		    date_int(&day, &mon, &year, TpPars.ragab);
		    datum.sprintf("%02d.%02d.%d", day, mon, year);
		 break;
		 default:  text = QString("??? <%1>").arg(dTable.kz);
	      }

	      if (dTable.kz != 'Z')
	      {
		 kapital = QString("%1").arg(PointNumber(dTable.kapital, 2, &hv0[0]));
		 tilg = QString("%1").arg(PointNumber(dTable.tilg, 2, &hv0[0]));
		 rate = QString("%1").arg(PointNumber(dTable.rate, 2, &hv0[0]));
		 zinsen = QString("%1").arg(PointNumber(dTable.zinsen, 2, &hv0[0]));
		 rkapi = QString("%1").arg(PointNumber(dTable.rkapi, 2, &hv0[0]));
	      }
	      else
	      {
		 kapital = QString("");
		 tilg = QString("");
		 rate = QString("");
		 zinsen = QString("");
		 rkapi = QString("");
	      }

	      QListViewItem *element = new QListViewItem(kListView_Plan, zeile, datum, text, kapital, tilg, rate, zinsen, rkapi);
	      kListView_Plan->insertItem(element);
	      line++;
	}

	tmpFile.close();
}

/*$SPECIALIZATION$*/
void ratenplanWidget::pbCancelSlot()
{
	done(QDialog::Accepted);
}

void ratenplanWidget::lbSelSlot(QListViewItem *item)
{
QString zeile;
QClipboard *cb = QApplication::clipboard();

	if (!item)
	   return;

	zeile.append(item->text(1).ascii());	// Datum
	zeile.append("\t");
	zeile.append(item->text(2).ascii());	// Text
	zeile.append("\t");
	zeile.append(item->text(3).ascii());	// Kapital
	zeile.append("\t");
	zeile.append(item->text(4).ascii());	// Tilgung
	zeile.append("\t");
	zeile.append(item->text(5).ascii());	// Rate
	zeile.append("\t");
	zeile.append(item->text(6).ascii());	// Zinsen
	zeile.append("\t");
	zeile.append(item->text(7).ascii());	// Restkapital

	cb->setText(zeile);
	textLabel_Status->setText(QString("Zeile %1 des Ratenplans wurde in Zwischenablage kopiert").arg(item->text(0).ascii()));
}

void ratenplanWidget::pbClipboardSlot()
{
QString hdir = QDir::homeDirPath ();
QString zeile, str;
QFile tmpFile;
TPPARS TpPars;
DTABLE dTable;
int day, mon, year, line;
char hv0[128];
struct stat sbuf;
QClipboard *cb = QApplication::clipboard();

	hdir.append("/.date_tbl.dat");
	tmpFile.setName(hdir);

	if (tmpFile.open(IO_ReadOnly) == FALSE)
	{
	   KMessageBox::error(0, QString("Could not open file for reading: %1").arg(tmpFile.errorString()));
	   return;
	}
	
	fstat (tmpFile.handle(), &sbuf);

	if (sbuf.st_size <= (long)sizeof(TPPARS))
	{
	   tmpFile.close ();
	   KMessageBox::information(this, i18n("Bitte berechnen sie zuerst einen Tilgungsplan!"));
	   return;
	}

	// Als erstes befindet sich die Struktur mit den Parametern und
	// Summenergebnissen in der Datei.
	read(tmpFile.handle(), &TpPars, sizeof(TPPARS));
	// Diese schreiben wir als erstes in das Clipboard
	zeile = QString("Auszahlungsbetrag:\t%1\n").arg(PointNumber(TpPars.rahmen, 2, &hv0[0]));
	date_int(&day, &mon, &year, TpPars.ragab);
	str.sprintf("Auszahlung am:\t%02d.%02d.%d\n", day, mon, year);
	zeile.append(str);
	str.sprintf("Zinssatz Soll:\t%s\n\n", PointNumber(TpPars.zssoll, 3, &hv0[0]));
	zeile.append(str);

	// Nun lesen wir den Ratenplan aus und schreiben das Ergebnis in das
	// Clipboard
	// Überschrift
	zeile.append("Datum\tText\tKapital\tTilgung\tRate\tZinsen\tRestkapital\n");
	// Loop
	line = 1;

	while (read (tmpFile.handle(), &dTable, sizeof(DTABLE)) >= (int)sizeof(DTABLE))
	{
	      date_int(&day, &mon, &year, dTable.datum);

	      if (dTable.kz != 'E')
		 str.sprintf("%02d.%02d.%d\t", day, mon, year);
	      else
		 str.sprintf("Raten: %ld\t", dTable.datum);

	      zeile.append(str);

	      switch (dTable.kz)
	      {
		 case 'U': zeile.append("Auszahlung\t"); break;
		 case 'A': zeile.append("Abschluss\t"); break;
		 case 'R': zeile.append("Rate\t"); break;
		 case 'Z':
		    str = QString("Zinssatzänderung auf %1\n").arg(dTable.rate, 0, 'f', 3);
		    zeile.append(str);
		 break;
		 case 'E': zeile.append("Ergebnis\t"); break;
		 default:
		    str = QString("??? <%1>\t").arg(dTable.kz);
		    zeile.append(str);
	      }

	      if (dTable.kz != 'Z')
	      {
		 str = QString("%1\t").arg(PointNumber(dTable.kapital, 2, &hv0[0]));
		 zeile.append(str);
		 str = QString("%1\t").arg(PointNumber(dTable.tilg, 2, &hv0[0]));
		 zeile.append(str);
		 str = QString("%1\t").arg(PointNumber(dTable.rate, 2, &hv0[0]));
		 zeile.append(str);
		 str = QString("%1\t").arg(PointNumber(dTable.zinsen, 2, &hv0[0]));
		 zeile.append(str);
		 str = QString("%1\n").arg(PointNumber(dTable.rkapi, 2, &hv0[0]));
		 zeile.append(str);
	      }
	      else
	      {
		 str = QString("\t\t\t\t\n");
		 zeile.append(str);
	      }
	      line++;
	}

	tmpFile.close();
	cb->setText(zeile);
	textLabel_Status->setText(i18n("Ratenplan wurde in Zwischenablage kopiert"));
}

void ratenplanWidget::pbSaveSlot()
{
}


#include "ratenplanwidget.moc"

